package main

import (
	"fmt"
)

/**
	defer 用于两阶段延迟执行。这种模式的美妙之处在于，只需一行代码，就可以完成诸如以下任务：
	- 打开数据库连接，然后关闭它
	- 设置模拟环境，然后拆除它
	- 获取分布式锁，然后释放它
	- ....
 */
func main() {
	// defer setupTeardown()() 相当于：
	// teardown := setupTeardown()
	// defer teardown()
	defer setupTeardown()()
	fmt.Println("Main function called")
}

func setupTeardown() func() {
	fmt.Println("Run initialization")
	return func() {
		fmt.Println("Run cleanup")
	}
}
